package com.lotusfall.jdbc;

import java.sql.*;
// 解决SQL注入问题：
public class JDBCTest07 {
    // 解决SQL注入问题：
    // PreparedStatement接口继承了Statement
    // 预编译数据库操作对象，对SQL语句的框架进行预编译，然后再给SQL语句传值
    // 解决SQL注入的关键是什么？
    //
    public static void main(String[] args) {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;

        String loginName = "zhangsan";
        String loginPwd = "123";
        try {
            // 1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2、获取链接
            String url = "jdbc:mysql://127.0.0.1:3306/learn?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
            String user = "root";
            String password = "994695";
            conn = DriverManager.getConnection(url,user,password);

            // 3、获取预编译的数据库操作对象
            // ？占位符，接受一个值
            String sql = "select * from t_user where loginName = ? and loginPwd = ?";
            // DBMS执行预编译（ PreparedStatement 效率更高）！！！！，会在编译阶段做类型的安全检查

            // statement 编译一次执行一次
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            // 给占位符传值：  第一个问号下标是1，第二个是2（JDBC下标从1开始）
            ps.setString(1,loginName);  // ？-> 'zhangsan'
            ps.setString(2,loginPwd);

            // 4、执行sql语句
            // 5、处理结果集
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}
